home *** CD-ROM | disk | FTP | other *** search
/ Freelog 115 / FreelogNo115-MaiJuin2013.iso / Internet / AvantBrowser / asetup.exe / _data / webkit / chrome_100_percent.pak / Unnamed File 000017.txt < prev    next >
Text File  |  2013-04-03  |  5KB  |  132 lines

  1. // Copyright (c) 2012 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4.  
  5. var SetIconCommon = requireNative('setIcon').SetIconCommon;
  6. var sendRequest = require('sendRequest').sendRequest;
  7.  
  8. function loadImagePath(path, iconSize, actionType, callback) {
  9.   var img = new Image();
  10.   img.onerror = function() {
  11.     console.error('Could not load ' + actionType + ' icon \'' +
  12.                   path + '\'.');
  13.   };
  14.   img.onload = function() {
  15.     var canvas = document.createElement('canvas');
  16.     canvas.width = img.width > iconSize ? iconSize : img.width;
  17.     canvas.height = img.height > iconSize ? iconSize : img.height;
  18.  
  19.     var canvas_context = canvas.getContext('2d');
  20.     canvas_context.clearRect(0, 0, canvas.width, canvas.height);
  21.     canvas_context.drawImage(img, 0, 0, canvas.width, canvas.height);
  22.     var imageData = canvas_context.getImageData(0, 0, canvas.width,
  23.                                                 canvas.height);
  24.     callback(imageData);
  25.   };
  26.   img.src = path;
  27. }
  28.  
  29. function verifyImageData(imageData, iconSize) {
  30.   // Verify that this at least looks like an ImageData element.
  31.   // Unfortunately, we cannot use instanceof because the ImageData
  32.   // constructor is not public.
  33.   //
  34.   // We do this manually instead of using JSONSchema to avoid having these
  35.   // properties show up in the doc.
  36.   if (!('width' in imageData) ||
  37.       !('height' in imageData) ||
  38.       !('data' in imageData)) {
  39.     throw new Error(
  40.         'The imageData property must contain an ImageData object or' +
  41.         ' dictionary of ImageData objects.');
  42.   }
  43.  
  44.   if (imageData.width > iconSize ||
  45.       imageData.height > iconSize) {
  46.     throw new Error(
  47.         'The imageData property must contain an ImageData object that ' +
  48.         'is no larger than ' + iconSize + ' pixels square.');
  49.   }
  50. }
  51.  
  52. function setIcon(details, callback, name, parameters, actionType) {
  53.   var iconSizes = [19, 38];
  54.   if ('iconIndex' in details) {
  55.     sendRequest(name, [details, callback], parameters);
  56.   } else if ('imageData' in details) {
  57.     if (typeof details.imageData == 'object') {
  58.       var isEmpty = true;
  59.       for (var i = 0; i < iconSizes.length; i++) {
  60.         var sizeKey = iconSizes[i].toString();
  61.         if (sizeKey in details.imageData) {
  62.           verifyImageData(details.imageData[sizeKey], iconSizes[i]);
  63.           isEmpty =false;
  64.         }
  65.       }
  66.  
  67.       if (!isEmpty) {
  68.         sendRequest(name, [details, callback], parameters,
  69.                     {noStringify: true, nativeFunction: SetIconCommon});
  70.       } else {
  71.         // If details.imageData is not dictionary with keys in set {'19', '38'},
  72.         // it must be an ImageData object.
  73.         var sizeKey = iconSizes[0].toString();
  74.         var imageData = details.imageData;
  75.         details.imageData = {};
  76.         details.imageData[sizeKey] = imageData;
  77.         verifyImageData(details.imageData[sizeKey], iconSizes[0]);
  78.         sendRequest(name, [details, callback], parameters,
  79.                     {noStringify: true, nativeFunction: SetIconCommon});
  80.      }
  81.     } else {
  82.       throw new Error('imageData property has unexpected type.');
  83.     }
  84.   } else if ('path' in details) {
  85.     if (typeof details.path == 'object') {
  86.       details.imageData = {};
  87.       var isEmpty = true;
  88.       function processIconSize(index) {
  89.         if (index == iconSizes.length) {
  90.           delete details.path;
  91.           if (isEmpty)
  92.             throw new Error('The path property must not be empty.');
  93.           sendRequest(name, [details, callback], parameters,
  94.                       {noStringify: true, nativeFunction: SetIconCommon});
  95.           return;
  96.         }
  97.         var sizeKey = iconSizes[index].toString();
  98.         if (!(sizeKey in details.path)) {
  99.           processIconSize(index + 1);
  100.           return;
  101.         }
  102.         isEmpty = false;
  103.         loadImagePath(details.path[sizeKey], iconSizes[index], actionType,
  104.           function(imageData) {
  105.             details.imageData[sizeKey] = imageData;
  106.             processIconSize(index + 1);
  107.           });
  108.       }
  109.  
  110.       processIconSize(0);
  111.     } else if (typeof details.path == 'string') {
  112.       var sizeKey = iconSizes[0].toString();
  113.       details.imageData = {};
  114.       loadImagePath(details.path, iconSizes[0], actionType,
  115.           function(imageData) {
  116.             details.imageData[sizeKey] = imageData;
  117.             delete details.path;
  118.             sendRequest(name, [details, callback], parameters,
  119.                         {noStringify: true, nativeFunction: SetIconCommon});
  120.       });
  121.     } else {
  122.       throw new Error('The path property should contain either string or ' +
  123.                       'dictionary of strings.');
  124.     }
  125.   } else {
  126.     throw new Error(
  127.         'Either the path or imageData property must be specified.');
  128.   }
  129. }
  130.  
  131. exports.setIcon = setIcon;
  132.